package main

/*
	生命游戏
根据 百度百科 ，生命游戏，简称为生命，是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。
给定一个包含 m × n 个格子的面板，每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态：
1 即为活细胞（live），或 0 即为死细胞（dead）。每个细胞与其八个相邻位置（水平，垂直，对角线）的细胞都遵循以下四条生存定律：

如果活细胞周围八个位置的活细胞数少于两个，则该位置活细胞死亡；
如果活细胞周围八个位置有两个或三个活细胞，则该位置活细胞仍然存活；
如果活细胞周围八个位置有超过三个活细胞，则该位置活细胞死亡；
如果死细胞周围正好有三个活细胞，则该位置死细胞复活；

下一个状态是通过将上述规则同时应用于当前状态下的每个细胞所形成的，
其中细胞的出生和死亡是同时发生的。给你 m x n 网格面板 board 的当前状态，返回下一个状态。
 */

func gameOfLife(board [][]int) {
	temp := make([][]int, len(board))
	for i := 0; i < len(board); i++ {
		temp[i] = make([]int, len(board[i]))
	}
	for i := 0; i < len(board); i++ {
		for j := 0; j < len(board[i]); j++ {
			nums := 0
			// 上面
			if i-1 >= 0 {
				nums += board[i-1][j]
			}
			// 左面
			if j-1 >= 0 {
				nums += board[i][j-1]
			}
			// 下面
			if i+1 < len(board) {
				nums += board[i+1][j]
			}
			// 右面
			if j+1 < len(board[i]) {
				nums += board[i][j+1]
			}
			// 左上
			if i-1 >= 0 && j-1 >= 0 {
				nums += board[i-1][j-1]
			}
			// 右上
			if i-1 >= 0 && j+1 < len(board[i]) {
				nums += board[i-1][j+1]
			}
			// 左下
			if i+1 < len(board) && j-1 >= 0 {
				nums += board[i+1][j-1]
			}
			// 右下
			if j+1 < len(board[i]) && i+1 < len(board) {
				nums += board[i+1][j+1]
			}
			temp[i][j] = board[i][j]
			switch {
			case nums < 2:
				temp[i][j] = 0
			case nums == 3 && temp[i][j] == 0:
				temp[i][j] = 1
			case nums > 3:
				temp[i][j] = 0
			}
		}
	}
	copy(board, temp)
}
